Зміст
Шифрування афінним шифром.
Завдання
Теоретичні відомості
Вибір ключів
Блок-схема алгоритму
Таблиця ідентифікаторів
Текст програми
Відкритий текст
Результат шифрування
Шифрування шифром RSA
Завдання
Теоретичні відомості
Вибір ключів
Зашифрування
Розшифрування
Висновки
Завдання
Вибрати ключі та розробити програму для за шифрування файлу даних заданим афінним шифром. Тип афінного шифру визначається останньою цифрою i НЗК. Об‘єм алфавіту визначається передостанньою цифрою j НЗК і дорівнює .
i
i mod 6
Тип афінного шифру
j
Розрядність алфавіту
Об‘єм алфавіту
3
3
Зсуву -го порядку
0
5
32
Теоретичні відомості
Афінні шифри- підклас шифрів заміни, що включає включає, як частковий випадок шифр Віжінера і навіть шифр перестановки з фіксованим періодом.
N-символьний алфавіт ототожнюємо з кільцем . А саме кожна буква замінюється своїм номером у алфавіті, причому нумерація починається з нуля. Наприклад, латинська абетка ототожнюється із , а українська із . Літера а української абетки трактується як нуль, літера б як 1, в як 2. Тепер до букв відкритого тексту. Тепер до букв відкритого тексту ми можемо вільно застосовувати операцію додавання та множення за відповідним модулем.
Шифр зсуву.
Ключ: таке, що .
Шифрування. У повідомлені кожна буква заміщується буквою .
Дешифрування. У криптотексті кожна буква заміщуються буквою ,де . Величину зворотнього зсуву будемо називати дешифруючим ключем.
Афінні шифри вищих порядків.
Для розширення попереднього методу(монограмний шифр) потрібно щоб вони оперували з -грамами для довільного . Спочатку введемо операцію додавання в . Сумою векторів і з є вектор . з операцією додавання є групою. Вектор є оберненим до вектора .
Шифр зсуву -го порядку (шифр Віжінера з періодом ).
Ключ. .
Шифрування. Повідомлення розбивається на -грами. Кожна -грама заміщується -грамою .
Дешифрування. Кожна -грама заміщується -грамою , де є дешифруючим ключем.
Вибір ключів
Ключ : {5, 7, 17, 23, 29}
Блок-схема алгоритму
Таблиця ідентифікаторів
Ідентифікатор
Тип ідентифікатора
Опис
n=32
int
Глибина алфавіту
key[5]={5,7,17,23,29}
int
Ключ зашифрування
*r_f
FILE
Вхідний файл
*w_f
FILE
Вихідний (зашифрований) файл
r_eof=0
int
Прапорець контролю кінця файлу
x_OK=1
int
Прапорець готовності символу
n_x=0
int
Лічильник символів (для блокового шифрування)
r_buf
unsigned long
Вхідний буфер даних (бітів)
w_buf = 0
unsigned long
Вихідний буфер даних (бітів)
x
unsigned long
Поточний символ
r_count=32
int
Лічильник бітів вхідного буфера
w_count=32
int
Лічильник бітів вихідного буфера
Текст програми
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
void main(void)
{
int n=32;
int key[5] = {5, 7, 17, 23, 29};
char *s;
FILE *r_f, *w_f;
int r_eof=0;
int x_OK=1;
int n_x=0;
unsigned long r_buf;
unsigned long w_buf = 0;
unsigned long x;
int r_count=32;
int w_count=32;
if ( (r_f=fopen("c:\\plain.f", "rb")) == NULL )
{
printf("cannot open the file data.fb");
getch();
exit(1);
}
else
if ( (w_f=fopen("c:\\encrypt.f", "wb")) == NULL )
{
printf("cannot open the file data.fbc");
getch();
exit(1);
}
else
{
if (fread(&r_buf, 1, 4, r_f) != 0)
while (!r_eof)
{
if (r_count<=0)
{
if (fread(&r_buf, 1, 4, r_f) != 0)
{
x |= (r_buf << (5+r_count)) & (n-1);
r_buf >>= (-r_count);
r_count += 32;
x_OK = 1 & !(r_count==32);
}
else
{
r_eof = 1;
x_OK = 1;
}
}
else
{
x = r_buf & (n-1);
r_buf >>= 5;
r_count -= 5;
x_OK = 1 & (r_count>=0);
}
if (x_OK)
{
x = (unsigned int)(fmod(x+key[n_x], n));
if (n_x==4)
n_x=0;
else
n_x++;
// printf("%4x", x);
itoa(x, s, 10);
fputs(strcat(s, " "), stdout);
w_buf |= x << (32-w_count);
w_count -= 5;
if (w_count<=0)
{
fwrite(&w_buf, 4, 1, w_f);
w_buf &= 0;
if (w_count==0)
w_count = 32;...